﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BaMusaSoft.RPS.DataModel;
using BaMusaSoft.RPS.DataModel.Repositories;
using BaMusaSoft.RPS.RPSServices;
using System.Windows.Input;
using System.ComponentModel;

namespace BaMusaSoft.RPS.ViewModel
{
    //public class OutboxViewModel:WorkspaceViewModel,IDataErrorInfo
    //{
    //    #region "Fields"
    //    Outbox outbox;
    //    readonly OutboxRepository repository;
    //    bool auotIncrementOutboxNo;
    //    DelegateCommand saveCommand;
    //    DelegateCommand findCommand;
    //    string outboxNoSearched;
    //    bool outboxSaved;

    //    #endregion
    //    #region "Constructor"
    //    public OutboxViewModel(Outbox outbox, OutboxRepository repository)
    //    {
    //        this.outbox = outbox;
    //        this.repository = repository;
    //        auotIncrementOutboxNo = false;
    //        OutboxSaved = false;
    //    }
    //    #endregion
    //    #region "Binding Properties"
    //    [Bindable(true)]
    //    public string OutboxNo
    //    {
    //        get { return outbox.OutboxNo; }
    //        set
    //        {
    //            outbox.OutboxNo = value;
    //            NotifyPropertyChanged("OutboxNo");
    //        }
    //    }
    //    [Bindable(true)]
    //    public string OutboxDate
    //    {
    //        get { return outbox.OutboxDate; }
    //        set
    //        {
    //            outbox.OutboxDate = value;
    //            NotifyPropertyChanged("OutboxDate");
    //        }
    //    }
    //    [Bindable(true)]
    //    public bool AutoIncrementOutboxNo
    //    {
    //        get { return auotIncrementOutboxNo; }
    //        set
    //        {
    //            auotIncrementOutboxNo = value;
    //            NotifyPropertyChanged("AutoIncrementOutboxNo");
    //        }
    //    }
    //    [Bindable(true)]
    //    public string OutboxNoSearched
    //    {
    //        get { return outboxNoSearched; }
    //        set
    //        {
    //            outboxNoSearched = value;
    //            NotifyPropertyChanged("OutboxNoSearched");
    //        }
    //    }
    //    [Bindable(true)]
    //    public Outbox CurrentOutbox
    //    {
    //        get { return outbox; }
    //    }
    //    public bool OutboxSaved
    //    {
    //        get { return outboxSaved; }
    //        set
    //        {
    //            outboxSaved = value;
    //            NotifyPropertyChanged("OutboxSaved");
    //        }

    //    }
    //    #endregion
    //    #region "Commands"
    //    public ICommand SaveCommand
    //    {
    //        get
    //        {
    //            if (saveCommand == null)
    //            {
    //                saveCommand = new DelegateCommand(par => Save());
    //            }
    //            return saveCommand;
    //        }
    //    }
    //    private void Save()
    //    {
    //        bool isNew = false;
    //        if (OkSave())
    //        {
    //            try
    //            {
    //                if (outbox.IsNew)
    //                {
    //                    repository.Add(outbox);
    //                    isNew = true;
    //                }
    //                repository.Save();
    //                OutboxSaved = true;
    //            }
    //            catch (Exception)
    //            {
    //                if (isNew) repository.Delete(outbox);
    //                throw;
    //            }
                
    //        }
    //    }
    //    public ICommand FindCommand
    //    {
    //        get
    //        {
    //            if (findCommand == null)
    //            {
    //                findCommand = new DelegateCommand(par => Find());
    //            }
    //            return findCommand;
    //        }
    //    }
    //    private void Find()
    //    {
    //        if (string.IsNullOrEmpty(OutboxNoSearched)) return;
    //        var outboxFounded = repository.GetByID(outboxNoSearched);
    //        if (outboxFounded != null)
    //        {
    //            this.outbox = outboxFounded;
    //            RefreshBinding();
    //        }

    //    }

    //    #endregion
    //    #region "Helper methods"
    //    bool OkSave()
    //    {
    //        ClearAllErrors();
    //        bool okSave = true;
    //        try
    //        {
    //            if (outbox == null)
    //            {
    //                okSave = false;
    //                throw new ArgumentNullException("outbox");
    //            }

    //            var validationResults = DomainValidator.Validate<Outbox>(outbox);
    //            //var policyResults = BusinessPolicies.ApplySignerPolicy(Signer);
    //            if (!validationResults.IsValid)
    //            {
    //                okSave = false;
    //                foreach (var result in validationResults)
    //                {
    //                    SetError(result.Key, result.Message);
    //                }
    //            }
    //            //if (!policyResults.IsValid)
    //            //{
    //            //    okSave = false;
    //            //    foreach (var resul in policyResults)
    //            //    {
    //            //        SetError(resul.Key, resul.Message);
    //            //    }
    //            //}

    //            return okSave;
    //        }
    //        catch (Exception)
    //        {

    //            throw;
    //        }
    //    }
    //    private void RefreshBinding()
    //    {
    //        //Query expression 
    //        var bindableProperties = from p in typeof(OutboxViewModel).GetProperties()
    //                                 where p.GetCustomAttributes(true).Cast<Attribute>().Contains(new BindableAttribute(true))
    //                                 select p;
    //        foreach (var p in bindableProperties)
    //        {
    //            NotifyPropertyChanged(p.Name);
    //        }
    //    }
    //    #endregion
      
    //    #region "IDataErrorInfo"
    //    Dictionary<string, string> errors = new Dictionary<string, string>();
    //    void SetError(string propertyName, string errorMessage)
    //    {
    //        errors[propertyName] = errorMessage;
    //        NotifyPropertyChanged(propertyName);
    //    }
    //    void ClearError(string propertyName)
    //    {
    //        errors.Remove(propertyName);
    //    }
    //    void ClearAllErrors()
    //    {
    //        List<string> proeprties = new List<string>();
    //        foreach (var error in errors)
    //        {
    //            proeprties.Add(error.Key);
    //        }
    //        errors.Clear();
    //        foreach (var property in proeprties)
    //        {
    //            NotifyPropertyChanged(property);
    //        }
    //    }
    //    public string Error
    //    {
    //        get { return null; }
    //    }

    //    public string this[string columnName]
    //    {
    //        get
    //        {
    //            if (errors.ContainsKey(columnName))
    //            {
    //                return errors[columnName];
    //            }
    //            return string.Empty;
    //        }
    //    }
    //    #endregion

    //    #region "Base"
    //    public override bool ModelHasChanges
    //    {
    //        get
    //        {
    //            return base.ModelHasChanges;
    //        }
    //    }
    //    protected override void OnDispose()
    //    {
    //        repository.Dispose();
    //    }
    //    #endregion
    //}
}
